
/*
 * (a)  (C) 1990 by Adobe Systems Incorporated. All rights reserved.
 *
 * (b)  If this Sample Code is distributed as part of the Display PostScript
 *	System Software Development Kit from Adobe Systems Incorporated,
 *	then this copy is designated as Development Software and its use is
 *	subject to the terms of the License Agreement attached to such Kit.
 *
 * (c)  If this Sample Code is distributed independently, then the following
 *	terms apply:
 *
 * (d)  This file may be freely copied and redistributed as long as:
 *	1) Parts (a), (d), (e) and (f) continue to be included in the file,
 *	2) If the file has been modified in any way, a notice of such
 *      modification is conspicuously indicated.
 *
 * (e)  PostScript, Display PostScript, and Adobe are registered trademarks of
 *	Adobe Systems Incorporated.
 * 
 * (f) THE INFORMATION BELOW IS FURNISHED AS IS, IS SUBJECT TO
 *	CHANGE WITHOUT NOTICE, AND SHOULD NOT BE CONSTRUED
 *	AS A COMMITMENT BY ADOBE SYSTEMS INCORPORATED.
 *	ADOBE SYSTEMS INCORPORATED ASSUMES NO RESPONSIBILITY
 *	OR LIABILITY FOR ANY ERRORS OR INACCURACIES, MAKES NO
 *	WARRANTY OF ANY KIND (EXPRESS, IMPLIED OR STATUTORY)
 *	WITH RESPECT TO THIS INFORMATION, AND EXPRESSLY
 *	DISCLAIMS ANY AND ALL WARRANTIES OF MERCHANTABILITY, 
 *	FITNESS FOR PARTICULAR PURPOSES AND NONINFRINGEMENT
 *	OF THIRD PARTY RIGHTS.
 */

/*
*	ImportApp.m
*
*	This class performs some of the global functions necessary to
*	manage the application.
*
*	Several application wide resources are retained as
*	instance variables. Examples are the hitPoint and
*	upathBuffer buffers, the hitSetting value and the
*	epsfContext.
*
*	The epsfContext is a separate context that is
*	used solely for imaging included epsf files. It
*	prevents any errors in the epsf files from harming
*	the application's context. If errors occur when imaging
*	an epsf file, the context is destroyed and a new one
*	created. (See the context setting methods in this file
*	as well as in GraphicEpsf.m for specific details on
*	how to switch the contexts.) 
*
*	Version:	2.0
*	Author:	Ken Fromm
*	History:
*			03-07-91		Added this comment.
*/

#import "ImportApp.h"
#import "Document.h"
#import "SaveAsPanel.h"

#import "DrawingViewWraps.h"

#import <appkit/Matrix.h>
#import <appkit/NXCursor.h>
#import <appkit/NXImage.h>
#import <appkit/Window.h>
#import <appkit/defaults.h>
#import <appkit/nextstd.h>

char	ControlFont[ ] = "ControlPointsFont";

@implementation ImportApp

+ new
{
	self = [super new];

	[self  setAutoupdate:YES];
	[self  initializeSelf];

	return self;
}

- free
{
	if (upathBuffer.pts)
		NX_FREE(upathBuffer.pts);
	if (upathBuffer.ops)
		NX_FREE(upathBuffer.ops);
	if (hitPoint.pts)
		NX_FREE(hitPoint.pts);
	if (hitPoint.ops)
		NX_FREE(hitPoint.ops);

	return [super free];
}

/*
* 	Allocate a buffer for use by any drawing view to send
* 	data to the PostScript server.
*
*	Allocate another buffer for use by any drawing view to
*	use as the hitdetection userpath. Initialize the description
*	since most of the components will remain the same.
*/
- initializeSelf
{
	int		i;

	contextFlag = YES;

	PSWDefineFont(ControlFont);

	NX_MALLOC(upathBuffer.pts, float, PTS_BUFFER);
	NX_MALLOC(upathBuffer.ops, char, OPS_BUFFER);

	NX_MALLOC(hitPoint.pts, float, PTS_HITPOINT);
	NX_MALLOC(hitPoint.ops, char, OPS_HITPOINT);

	for (i = 0; i < PTS_HITPOINT; i++)
		hitPoint.pts[i] = 0;			
	hitPoint.num_pts = i;
 	
	i = 0;
	hitPoint.ops[i++] = dps_setbbox;
	hitPoint.ops[i++] = dps_moveto;
	hitPoint.ops[i++] = dps_rlineto;
	hitPoint.ops[i++] = dps_rlineto;
	hitPoint.ops[i++] = dps_rlineto;
	hitPoint.ops[i++] = dps_closepath;
	hitPoint.num_ops = i;

	return self;
}

- setSaveAccessory:anObject
{
	id		savepanel;

	savepanel = [SaveAsPanel  new];

	[savepanel  setAccessoryView:anObject];
	[savepanel  setSaveTo];

	return self;
}

- setContextFlag:sender
{
	if (!contextFlag)
		[[sender selectedCell] setTitle:"Separate Context On"];
	else
		[[sender selectedCell] setTitle:"Separate Context Off"];

	contextFlag = !contextFlag;
	
	return self;
}

- (BOOL) contextFlag
{
	return contextFlag;
}

- setShowEpsfFlag:sender
{
	if (!showEpsfFlag)
		[[sender selectedCell] setTitle:"Show Epsf On"];
	else
		[[sender selectedCell] setTitle:"Show Epsf Off"];

	showEpsfFlag = !showEpsfFlag;

	return self;
}

- (BOOL) showEpsfFlag
{
	return showEpsfFlag;
}

- setTracingFlag:sender
{
	if (!tracingFlag)
		[[sender selectedCell] setTitle:"Trace On"];
	else
		[[sender selectedCell] setTitle:"Trace Off"];

	tracingFlag = !tracingFlag;
	
	return self;
}

- (BOOL) tracingFlag
{
	return tracingFlag;
}

- (UPath *) hitPoint;
{
	return &hitPoint;
}

- (UPath *) upathBuffer;
{
	return &upathBuffer;
}

- resourcePanel
{
	if (!resourcePanel)
		[NXApp  loadNibSection:"ResourcePanel.nib"  owner:self  withNames:NO];

	return resourcePanel;
}

- cursor
{
	id		imageId, cursorId;

	NXPoint	spot;

	if (operation == OP_IMPORT)
	{
		if (!importId)
		{
			imageId = [NXImage  newFromSection:"cursorImport.tiff"];
			importId = [NXCursor  newFromImage:imageId];
			spot.x = 2.0;  spot.y = 1.0;
			[importId setHotSpot:&spot];
		}
		cursorId = importId;
	}
	else
		cursorId = NXArrow;

	return cursorId;
}

- setOperation:(int) op
{
	operation = op;
	[[documentId  window]  invalidateCursorRectsForView:[[documentId  window] contentView]];

	return self;
}

- (int) operation
{
	return operation;
}

/*
 *	Application delegate methods.
 */
- appDidInit:sender
{
	documentId = [Document  new];	

	return self;
}

@end

